package com.rbac.api.service.common;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rbac.api.constant.AdminConstant;
import com.rbac.api.controller.enums.HintMessageEunm;
import com.rbac.api.exception.AdminAllException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

///操作管理员token公共service
@Service
public class AdminCommonService {


    //操作 redis
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 请求头内获取 token
     * @param request
     * @return
     * @throws AdminAllException
     * @throws Exception
     */
    public String getTokenByRequestHeader(HttpServletRequest request) throws Exception{

        String headerToken =  request.getHeader(AdminConstant.ADMIN_HEADER_TOKEN_KEY);
        if(StringUtils.isEmpty(headerToken)){
            //提示参数错误
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_PARAME_ERROR_EXCEPTION);
        }

        return headerToken;
    }

    /**
     * 根据 token 在redis 内获取 管理员编号
     * @param headerToken
     * @return
     * @throws AdminAllException
     * @throws Exception
     */
    public String getUserNoByHeaderToken(String headerToken) throws Exception{
        if(StringUtils.isEmpty(headerToken)){
            //提示参数错误
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_TOKEN_PARAME_ERROR_EXCEPTION);
        }
        //获取当前管理员信息
        String userInfoJsonStr = stringRedisTemplate.opsForValue().get(headerToken);
        JSONObject userInfoJsonArr = JSONArray.parseObject(userInfoJsonStr);
        if(StringUtils.isEmpty(userInfoJsonStr) || StringUtils.isEmpty(userInfoJsonArr)){
            //提示 请先登录
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_NO_LOGIN_ERROR_EXCEPTION);
        }
        //获取编号
        Object userno =  userInfoJsonArr.get("userno");
        if(StringUtils.isEmpty(userno)){
            //提示数据解析失败
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_DATA_ANALYSIS_ERROR);
        }
        //
        return userno.toString();
    }

    ///根据request获取管理员编号
    public String getUserNoByRequestHeader(HttpServletRequest request) throws Exception{
        //获取当前管理员信息
        String token = getTokenByRequestHeader(request);
        ///获取管理员编号
        return getUserNoByHeaderToken(token);
    }







    ///根据token获取用户信息指定字段
    public String getUserInfoFieldByHeaderToken(String headerToken,String field) throws Exception{
        if(StringUtils.isEmpty(headerToken)){
            //提示参数错误
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_TOKEN_PARAME_ERROR_EXCEPTION);
        }
        //获取当前管理员信息
        String userInfoJsonStr = stringRedisTemplate.opsForValue().get(headerToken);
        JSONObject userInfoJsonArr = JSONArray.parseObject(userInfoJsonStr);
        if(StringUtils.isEmpty(userInfoJsonStr) || StringUtils.isEmpty(userInfoJsonArr)){
            //提示 请先登录
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_NO_LOGIN_ERROR_EXCEPTION);
        }
        //获取编号
        Object userno =  userInfoJsonArr.get(field);
        if(StringUtils.isEmpty(userno)){
            //提示数据解析失败
            throw new AdminAllException(HintMessageEunm.EXCEPTION_H_DATA_ANALYSIS_ERROR);
        }
        //
        return userno.toString();
    }

    ///根据request内的token获取用户信息指定字段
    public String getUserInfoFieldByRequestHeader(HttpServletRequest request,String field) throws Exception{
        //获取当前管理员信息
        String token = getTokenByRequestHeader(request);
        ///获取管理员编号
        return getUserInfoFieldByHeaderToken(token,field);
    }





}
